【问题标题】:Hibernate creating relation on @JoinTableHibernate 在@JoinTable 上创建关系
【发布时间】:2014-08-22 17:04:27
【问题描述】:

我有两个具有多对多关系的表,它们具有如下所示的 JoinTable USER_SERVICES。

@Entity
public class User implements Serializable {

    @NotNull
    @Column(unique=true)
    private String username;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(
            name = "USER_SERVICES",
            joinColumns = {@JoinColumn(name = "id", referencedColumnName = "id")},
            inverseJoinColumns = {@JoinColumn(name = "", referencedColumnName = "name")})
    private Set<Services> services;

    // Getters and Setters
}   


@Entity
public class Services implements Serializable {

    @NotNull
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    private Long serviceId;

    @NotNull
    @Column(unique=true)
    private String name;

    //Getters and Setters

}

上面的代码创建了一个表 USER_SERVICES,但我还想在表 USER_SERVICES 上与另一个表 RATINGS 建立多对多关系,这将导致另一个表 USER_SERVICES_RATINGS。如何使用 Hibernate/JPA 注释定义这种关系?

【问题讨论】:

  • 您可能会发现 my tutorial 在带有注释的 Hibernate 映射上很有帮助。
  • 谢谢@JamesMassey,按照您的教程,我能够解决我的问题。如果您还可以在 CascadeType 上为 manytomany 添加更多代码,那就太好了。如果您可以在这里复制粘贴您的教程中的代码,我会接受您的回答。
  • 如果你觉得有帮助别忘了点赞:P

标签: java hibernate jakarta-ee jpa hibernate-mapping


【解决方案1】:

您需要创建一个显式的UserServices 实体并根据您的需要设置与Ratings 实体的关系。

请记住,在 hibernate 中,您建模实体(即您的 java 对象)之间的关系,而不是 db 表。

【讨论】:

  • 没错,泰勒,多亏了你和詹姆斯,我才得以解决问题。我正在等待詹姆斯在这里发布他的教程中的 sn-p,否则我会接受你的回答。
【解决方案2】:

双向多对多使用用户管理的连接表对象(比较常见)

当您想要在连接对象上存储额外信息时通常使用,例如创建关系的日期。

public class Foo{
    private UUID fooId;

    @OneToMany(mappedBy = "bar", cascade=CascadeType.ALL)
    private List<FooBar> bars;
}

public class Bar{
    private UUID barId;

    @OneToMany(mappedBy = "foo", cascade=CascadeType.ALL)
    private List<FooBar> foos;
}

@Entity
@Table(name="FOO_BAR")
public class FooBar{
    private UUID fooBarId;

    @ManyToOne
    @JoinColumn(name = "fooId")
    private Foo foo;

    @ManyToOne
    @JoinColumn(name = "barId")
    private Bar bar;

    //You can store other objects/fields on this table here.
}

【讨论】:

  • 一切都好,但我怎样才能直接从Foo 对象中获取所有Bar 对象而不丢失我的自定义FooBar 表?
猜你喜欢
  • 2012-07-13
  • 2021-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
相关资源
最近更新 更多