栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在Hibernate教程中添加CONSTRAINT

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在Hibernate教程中添加CONSTRAINT

为什么添加约束看起来像机器生成的字符串“ FKr38us2n8g5p9rj0b494sd3391”?难道不是应该在一个更有意义的约束下手动创建它吗?

当然,约束不是由数据库生成的。它是由Hibernate生成的。

FKr38us2n8g5p9rj0b494sd3391
由于某些数据库中的约束名称长度受到限制,因此生成了这个奇怪的名称。例如,在Oracle数据库中,其长度不能超过30个符号。

Hibernate通过连接表和属性名称来生成约束名称,并将结果转换为

MD5
,生成类似的字符串
FKr38us2n8g5p9rj0b494sd3391
。该代码段来自Hibernate源代码

public String hashedName(String s) {    try {        MessageDigest md = MessageDigest.getInstance( "MD5" );        md.reset();        md.update( s.getBytes() );        byte[] digest = md.digest();        BigInteger bigInt = new BigInteger( 1, digest );        // By converting to base 35 (full alphanumeric), we guarantee        // that the length of the name will always be smaller than the 30        // character identifier restriction enforced by a few dialects.        return bigInt.toString( 35 );    }    catch ( NoSuchAlgorithmException e ) {        throw new HibernateException( "Unable to generate a hashed name!", e );    }}

您可以使用生成自己的约束名称(唯一键和外键)

ImplicitNamingStrategy
。您可以参考Hibernate5NamingStrategy作为示例。

另外,还可以使用

@ForeignKey
@JoinColumn
注释来指定约束名称(在通常情况下)。

对于

@JoinTable
联接表,可以使用注释,如@uditkhare建议的那样。但是您需要提供更多信息(不是很方便)

@oneToMany(cascade = CascadeType.ALL, orphanRemoval = true)@JoinTable(name="person_phones",     joinColumns = @JoinColumn(name = "f_person_pid", foreignKey = @ForeignKey( name = "fk_person_phones_person")),     inverseJoinColumns = @JoinColumn(name = "fk_phone", foreignKey = @ForeignKey(name = "fk_person_phones_phone")), uniqueConstraints = @UniqueConstraint(name = "uk_person_phones_phone", columnNames = { "fk_phone" }))private List<Phone> phones = new ArrayList<>();

在这种情况下,ADD CONSTRAINT是可选的吗?

否。这不是可选的。需要建立

@OneToMany
关系模型。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/382434.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号