2016-12-15 209 views
0

我想休眠生成一些表与外键等。我给你我想Hibernate来生成查询的一个例子:休眠ForeignKey映射注释

create table RealtimeCost(id INTEGER not null primary key Autoincrement, 
    mnemonic varchar(50)not null references Exchange(mnemonic), 
    sid int not null references License(sid), 
    price numeric(10,2) not null) 

所以此查询应该由Hibernate通过注解生成。对应的类是这样的:

什么在 RealtimeCostmnemonic应该映射到
@Entity 
@Table 
public class RealtimeCost { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 
    @MapsId("mnemonic") 
    @JoinColumn(referencedColumnName="sid") 
    private String mnemonic; 
    @MapsId("sid") 
    @JoinColumn(referencedColumnName="sid") 
    private Integer sid; 
    @Column 
    private Double price; 

例子(RealtimeCost每个助记符在Exchange准确值为1):

@Entity 
@Table 
public class Exchange { 
    @Id 
    @Column(name="mnemonic") 
    private String exchange; 
    @Column 
    private String description; 

正如你可以看到我已经在文档的帮助下尝试了一下,但我无法通过休眠生成外键。如果有人能够告诉我这个班级需要的注释和价值,那真的很友善,所以我可以自己为其他班级做这些。也请告诉我,如果我需要更改Exchange类中映射工作的任何内容。在此先感谢

回答

1

我不是专家,但我们让hibernate完成加入实体的javax.persistence注释的所有工作。

@javax.persistence.ManyToOne(fetch = javax.persistence.FetchType.EAGER, optional = true) 
    @javax.persistence.JoinColumn(name = "VIEWTYPE_ID", nullable = true, unique = false, insertable = true, updatable = true) 
    private com.company.other.subproject.ViewType viewType; 

也许这就是你需要的。因为这让hibernate关心必须创建的表,并且foreignKeys会使用与之通信的数据库的方言自动创建。

+0

这是否将类型'ViewType'的对象映射到类'ViewType'的id? – Aelop

+0

你能告诉我你是如何注释viewtype ID吗? – Aelop

+0

对不起,对了。是的,它将实体映射为ID参考。使用FetchType,您可以进一步指定应该如何加载它。 (Lazy or Eager) ViewType用这个'@AttributeOverrides({@AttributeOverride(name =“id”,column = @Column(name =“VIEWTYPE_ID”)) }''注解,但是这个注解是在类定义。因为我们使用另一种声明实体的策略。但id列是用@Id注解的。 这是'@ javax.persistence.Basic(fetch = javax.persistence.FetchType.EAGER,optional = false)' – Nico

1

您应该在一个实体中设置关联,并在另一个实体中使用mappedBy。您不需要@MapsId,因为您没有使用嵌入式实体(请阅读文档)。在@OneToMany@ManyToOne关系看一看:

@Entity 
@Table 
public class RealtimeCost { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 

    @OneToMany 
    @JoinColumn(name="mnemonic") 
    private Exchange exchange; 
    ... 
} 

@Entity 
@Table 
public class Exchange { 
    @Id 
    @Column(name="mnemonic") 
    private String mnemonic; 

    @Column 
    private String description; 

    @ManyToOne(mappedBy="exchange") 
    private RealtimeCost realtimeCost; 
    ... 
} 
+0

这个'@ManyToOne(mappedBy =“exchange”)'导致错误的示例注释me'注释类型ManyToOne'没有定义属性mappedBy – Aelop

2
@ManyToOne(fetch = FetchType.EAGER) 
@JoinColumn(name = "accommodation_type", unique = true, nullable = false) 
private AccommodationType accommodationType; 

@ManyToOne()根据@JoinColumn() name@JoinColumn()创建一个关系就是你想连接的表名。

然后,当你创建一个要连接到主类的类,你首先需要给它一个表名下方@Entity e.g @Table(name="accommodation_types")

然后创建您的变量。

//bi-directional many-to-one association to Accommodation 
@OneToMany(mappedBy="accommodationType", fetch=FetchType.EAGER) 
private List<Accommodation> accommodations; 

mappedBy的值是主类中的变量名。

1

发表在这里的每个答案都得到了我的赞赏,因为每个人都挺对,但这不是我正在寻找的100%,但它帮助我自己解决了我的问题。对于i张贴例如i正在寻求解决方案如下(我还添加不可为空):

@Entity 
@Table 
public class RealtimeCost { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer id; 
    @ManyToOne 
    @JoinColumn(name = "mnemonic",nullable=false) 
    private Exchange exchange; 
    @ManyToOne 
    @JoinColumn(name = "sid",nullable=false) 
    private License license; 
    @Column(nullable=false) 
    private Double price; 

这些是:i拟出售RealtimeCost类注释。我不需要Exchange类中的任何特殊注释。@Nico答案与我所需要的最接近,因此他的答案将被接受