2016-03-23 2 views
0

Я использую Hibernate с JPA 2.1, и я хочу определить объект с двумя субиндексами. Моя проблема в том, что я хочу определить UniqueConstraint с двумя столбцами: One MemberField и DiscriminatorColumn.JPA Entity Inheritance and UniqueConstraint with DiscriminatorColumn

EDIT: Поскольку ответ Николая решить мою конкретную проблему, я изменил тип родительского класса от абстрактного к неабстрактному.

Мой код выглядит следующим образом:

Родитель

@Entity 
@Inheritance 
@DiscriminatorColumn(name = "TYPE") 
@Table(name = "EXAMPLE", uniqueConstraints = @UniqueConstraint(columnNames = { "TYPE", "NAME" })) 
public class ExampleParent extends AbstractEntity 
{ 
    private static final long serialVersionUID = 68642569598915089L; 

    @Column(name = "NAME", nullable = false, length = 30) 
    @NotNull 
    private String name; 

    ... 

} 

Ребенок 1

@Entity 
@DiscriminatorValue("TYPE1") 
public class Example1 extends ExampleParent 
{ 
    private static final long serialVersionUID = -7343475904198640674L; 

    ... 

} 

Ребенок 2

@Entity 
@DiscriminatorValue("TYPE2") 
public class Example2 extends ExampleParent 
{ 
    private static final long serialVersionUID = 9077103283650704993L; 

    ... 

} 

Теперь я не хочу UniqueConstraint на имя ExampleParent, потому что я хочу иметь возможность сохранять два объекта Example1 и Example2 с тем же именем. Следующий код должен объяснить:

@Autowired 
Example1Repository example1Repo; 

@Autowired 
Example2Repository example2Repo; 

Example1 example1 = new Example1(); 
example1.setName("example"); 
example1Repo.save(example1); 

Example2 example2 = new Example2(); 
example2.setName("example"); 
example2Repo.save(example2); 

Так что моя цель состоит в том, чтобы установить UniqueConstraint из двух столбцов, но я на самом деле хочу использовать DiscriminatorColumn и поле моего ExampleParent. Комбинация DiscriminatorColumn и имя должно быть уникальным.

Мой код не работает, поэтому какие у меня варианты?

+0

с вашим кодом выше, вы получите исключение ConstraintViolationException? Вы имеете в виду, что вы не можете вставлять Example1 и Example2 с тем же именем? –

+0

@ oliv37 Да Я получаю ConstraintViolationException: Повторяющаяся запись «пример» для ключа ... – shinchillahh

ответ

1

Если вы используете абстрактный базовый класс, я бы ожидал, что вы будете использовать аннотацию @MappedSuperclass вместо @Inheritance.

@MappedSuperclass лучше для полиморфизма, что и есть у вас. Я не думаю, что @Inheritence поддерживает полиморфизм.

+0

Прежде всего, я благодарен за ваш ответ. Вы правы: в моем случае лучше использовать '@ MappedSuperclass', потому что у меня не будет собственного Entity родительского класса. Тем не менее я спрашиваю себя, как решить первоначальную проблему. Можно ли комбинировать '@ UniqueConstraint' члена поля и' @ DiscriminatorColumn'? – shinchillahh

Смежные вопросы