Hibernate Jpa Аннотация: проблема со встроенным идентификатором - PullRequest
5 голосов
/ 06 июля 2011

У меня есть эта схема БД:

TABLE_A [1] -> [п] Table_C а также TABLE_B [1] -> [п] Table_C

Теперь PrimaryKey для Table_C является EmbeddedId с внешним ключом в сравнении с Table_A и внешним ключом в сравнении с Table_B. Как мне отметить эту аннотацию?

Мое решение:

@Entity
public class TableA{
    @Id @column(name="ID")
    public int id;

    @OneToMany(mappedBy="tableA")
    public List<TableC> listOftableC; 
}

@Entity
public class TableB{
    @Id @column(name="ID")
    public String id;

    @OneToMany(mappedBy="tableB")
    public List<TableC> listOftableC; 

}

@Entity
public class TableC{
    @EmbeddedId
    public TableCPK idComposite;
}

@Embeddable
public class TableCPK{

    @ManyToOne
    @JoinColumn(name = "ID_TABLE_A", referencedColumnName="ID")
    public TableA tableA;

    @ManyToOne
    @JoinColumn(name = "ID_TABLE_B", referencedColumnName="ID")
    public TableA tableB;
}

1 Ответ

5 голосов
/ 06 июля 2011

Когда вы будете следовать спецификации JPA, вы заметите, что нет необходимости отображать tableC.Вы можете просто использовать объединяемую таблицу

Примерно так:

@Entity
public class TableA{
    @Id
    @column(name="ID")
    public int id;
    @ManyToMany
    @JoinTable(name="TableC",
            joinColumns = {@JoinColumn(name = "ID_TABLE_A", referencedColumnName="ID")},
            inverseJoinColumns = {@JoinColumn(name = "ID_TABLE_B", referencedColumnName="ID")
    })
    public List<TableB> listOftableB;
}
@Entity 
public class TableB{
     @Id @column(name="ID")
     public String id;
     @OneToMany(mappedBy="listOftableB")
     public List<TableA> listOftableA;
}

, если вы хотите отобразить что-то в JoinTable, вы также можете определить это как сущность.Вы можете отобразить tableC следующим образом

@Entity
public class TableC{
    @EmbeddedId
    private MyId id;
    @ManyToOne
    @JoinColumn(name = "ID_TABLE_A", insertable = false, updatable = false)
    private TableB tableA;
    @ManyToOne
    @JoinColumn(name = "ID_TABLE_B", insertable = false, updatable = false)
    private TableB tableB;

    @Column(name="extra_field")
    private String extraField;
}

@Embeddable
public class MyId{
    @Column(name="ID_TABLE_A")
    private int idTableA;
    @Column(name="ID_TABLE_B")
    private int idTableB;
    // equals, hascode,...
}

Сделав объекты вставляемыми / обновляемыми false, вы можете сопоставить одни и те же свойства несколько раз.Другие свойства в id не подлежат обновлению, потому что вы сломаете свой pk.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...