如何在JPA中定义单向OneToMany关系


70

我在JPA中使用实体映射存在以下问题。我有两个实体,第一个是Lookup,第二个是Text,它表示实体的翻译。现在,我需要将Lookup绑定到Text,但是我不希望Text引用Lookup。更复杂的是,Text在此关系中不使用其主键,而是在TXTHEAD_CODE列中定义的元代码 。

Lookup.java

@Entity
@Table(name = "DATREG")
public class Lookup implements PersistableEntity {

    @Id
    @Column(name = "DATREG_META_CODE")
    private String metaCode;

    @OneToMany
    @JoinTable(name="TXT", 
            joinColumns=@JoinColumn(name="DATREG_META_CODE", referencedColumnName="TXTHEAD_CODE"),
            inverseJoinColumns=@JoinColumn(name="DATREG_META_CODE"))
    private List<Text> text;

Text.java

@Entity
@Table(name = "TXT")
public class Text {

    @Id
    @Column(name = "TXT_ID")
    private Long id;

    @Column(name = "TXTHEAD_CODE")
    private String code;

因此,我尝试了这种方法(以及其他几种方法),但没有结果。我也无法在数据库中创建联接表,也不想将Lookup绑定到Text类。所以有人可以告诉我是否还有其他方法吗?

Answers:


135

我从事JPA工作的圣经是Java Persistence Wikibook。它有一个关于单向OneToMany部分,说明了如何通过@JoinColumn注释进行此操作。就您而言,我想您会想要:

@OneToMany
@JoinColumn(name="TXTHEAD_CODE")
private Set<Text> text;

我使用Set而不是List,因为数据本身没有顺序。

上面使用的是默认值referencedColumnName,与Wikibook中的示例不同。如果这不起作用,请尝试一个明确的方法:

@OneToMany
@JoinColumn(name="TXTHEAD_CODE", referencedColumnName="DATREG_META_CODE")
private Set<Text> text;

哇,确实有效,谢谢。我以为,如果关系的只有一侧(另一侧不保留外键),则总是需要创建一个联接表。
Petr Mensik 2012年

2
答对了!这个“ Java Persistence Wikibook”链接是我一直在寻找的...感谢分享...
Ahmet

我正在尝试相同的操作,但是未在数据库的子实体中设置外键,但出现了以下异常:oracle.jdbc.OracleDatabaseException: ORA-01400: cannot insert NULL into
Sandeep Kumar

@SandeepKumar“子实体”是什么意思?Text在此示例中是否等效?我怀疑JPA不会将引用的列视为外键,在这种情况下,它不会用父ID填充它。恐怕您必须在保存之前自行设置。
汤姆·安德森

1
我通过从子类中删除该属性来解决此问题。现在,JPA正在隐式考虑父类中提到的键并插入值。谢谢!
Sandeep Kumar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.