误差的UniqueConstraint在JPA

问题描述:

自定义类型我有一个测试,看起来像这样:误差的UniqueConstraint在JPA

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = TestConfig.class) 
public class TestTruckRepository { 
    @Autowired 
    private TruckRepository truckRepository; 

    @Transactional 
    @Test 
    public void doIt(){ 
     //omitted 
    } 
} 

的方法doIt方法()甚至没有达到。我收到的错误是:

org.hibernate.AnnotationException: Unable to create unique key constraint (PlateNumber) on table Truck: database column 'plateNumber' not found. Make sure that you use the correct column name which depends on the naming strategy in use (it may not be the same as the property name in the entity, especially for relational types) 

这里是一个错误是指的类:

@Entity 
@Table(uniqueConstraints = @UniqueConstraint(columnNames = {"plateNumber"})) 
public class Truck implements Identifiable { 
    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.MERGE) 
    private PlateNumber plateNumber; 
    private String stuff; 

    @Id 
    @GeneratedValue 
    private Long id; 

//Getter setter and constructor are omitted. 
} 

如果我删除了“uniqueConstraints = ....”然后它似乎是工作很好,但财产不是唯一的。任何想法如何解决这个问题?错误是告诉我看看命名。我真的很想避免在我的所有属性中放置@Column或@JoinColumn(我知道这会解决它)。我猜测hibernate正在创建一个与属性不同的名称,因为它比只有一个字符串作为属性更复杂,但我想避免将这些信息存储在我的类中。

编辑:所有表都是通过休眠创建的,所以我无法进入数据库并查找列名。

+0

您确定您希望某个特定的列是唯一的,但是不要为将成为此列的字段定义@Column。一个N-1将是一个FK,并且将有一个特定的名称作为默认值......并且它不会是“plateNumber” –

+0

定义@ Column根据我所知甚至不可能实际可行,我认为我会选择是@ JoinColumn,这迫使我指定字符串作为列名。我宁愿冬眠生成这些。 –

+0

好好迂回的注释是JoinColumn但点是一样的。您没有定义自动生成的名称,因此它会为您生成,并且此自动生成的名称不会是“plateNumber”,但您希望有一个名为“plateNumber”的列。并没有。所以这一切都崩溃了。所以定义它。你定义了一个字符串作为Unique的列名,所以不明白这种沉默 –

卡车表中的plateNumber的列名称(签入数据库)是什么?

@UniqueConstraint(columnNames = {"plateNumber"}) 

UniqueConstraint有columnNames,所以它不必与您的属性名称相同。你使用什么命名策略? JPA根据配置的命名策略创建表,列和其他对象的名称。默认情况下,应该使用SimpleNamingStrategy,在这种情况下,它应该可以工作,因为结果列名应该是属性名称plateNumber。

+0

这个db是一个小而简单的应用程序(至少现在是这样),所以我只是让jpa/hibernate创建表。我还没有定义命名策略,所以在我看来,默认名称应该是plateNumber。 –

+0

尝试检查列名是否在数据库中正确...如果要明确定义列名,请使用@JoinColumn –

+0

如果您不想使用JoinColumn,则需要将UniqueConstraint注释中的columnName更改为从hibernate生成值。 –