此示例来自JBOSS的hibernate教程。该链接位于:http
:
//docs.jboss.org/hibernate/orm/5.1/userguide/html_single/Hibernate_User_Guide.html#embeddables。
例子79.单向的@OneToMany关联
@Entity(name = "Person")
public static class Person {
@Id
@GeneratedValue
private Long id;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
private List<Phone> phones = new ArrayList<>();
public Person() {
}
public List<Phone> getPhones() {
return phones;
}
}
@Entity(name = "Phone")
public static class Phone {
@Id
@GeneratedValue
private Long id;
private String number;
public Phone() {
}
public Phone(String number) {
this.number = number;
}
public Long getId() {
return id;
}
public String getNumber() {
return number;
}
}
CREATE TABLE Person (
id BIGINT NOT NULL ,
PRIMARY KEY ( id )
)
CREATE TABLE Person_Phone (
Person_id BIGINT NOT NULL ,
phones_id BIGINT NOT NULL
)
CREATE TABLE Phone (
id BIGINT NOT NULL ,
number VARCHAR(255) ,
PRIMARY KEY ( id )
)
ALTER TABLE Person_Phone
ADD CONSTRAINT UK_9uhc5itwc9h5gcng944pcaslf
UNIQUE (phones_id)
ALTER TABLE Person_Phone
ADD CONSTRAINT FKr38us2n8g5p9rj0b494sd3391
FOREIGN KEY (phones_id) REFERENCES Phone
ALTER TABLE Person_Phone
ADD CONSTRAINT FK2ex4e4p7w1cj310kg2woisjl2
FOREIGN KEY (Person_id) REFERENCES Person
我的问题是,在此示例中:
1)为什么添加约束看起来像机器生成的字符串“ FKr38us2n8g5p9rj0b494sd3391”?难道不是应该在一个更有意义的约束下手动创建它吗?
2)在这种情况下,ADD CONSTRAINT是可选的吗?
为什么添加约束看起来像机器生成的字符串“ FKr38us2n8g5p9rj0b494sd3391”?难道不是应该在一个更有意义的约束下手动创建它吗?
当然,约束不是由数据库生成的。它是由Hibernate生成的。
FKr38us2n8g5p9rj0b494sd3391
由于某些数据库中的约束名称长度受到限制,因此生成了这个奇怪的名称。例如,在Oracle数据库中,其长度不能超过30个符号。
Hibernate通过连接表和属性名称来生成约束名称,并将结果转换为MD5
,生成类似的字符串FKr38us2n8g5p9rj0b494sd3391
。该代码段来自Hibernate源代码
/**
* Hash a constraint name using MD5. Convert the MD5 digest to base 35
* (full alphanumeric), guaranteeing
* that the length of the name will always be smaller than the 30
* character identifier restriction enforced by a few dialects.
*
* @param s The name to be hashed.
*
* @return String The hashed name.
*/
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
关系模型。
Hibernate 是一种高性能的对象/关系持久性和查询服务,它是在开源 GNU 宽通用公共许可证(LGPL)下许可的,可以免费下载。
Hibernate 是一个高性能的对象/关系型持久化存储和查询的服务,其遵循开源的 GNU Lesser General Public License (LGPL) 而且可以免费下载。Hibernate 不仅关注于从 Java 类到数据库表的映射(也有 Java 数据类型到 SQL 数据类型的映射),另外也提供了数据查询和检索服务。
在上一节中,我们使用Python和XlsxWriter模块创建了一个简单的电子表格。 它将所需的数据转换为了Excel文件,但是看起来有一点简陋。为了让信息看起来更加清晰,我们想要添加一些简单的格式,如下图所示: 图中表格与上一节所创建的电子表格的区别在于,其对Item和Cost列标题进行了加粗,对第二列的数据设置了货币格式,将Total字符串进行了加粗。 基于此,我们可以像下面这样扩展之前的程序
我最近刚刚开始对hibernate湿透。我一直在关注一个关于hibernate的在线hibernate教程。在课程中,创建了两个类;User详情,地址。User详情类使用@Entity注释,而地址类使用@Embedable注释。 与其在UserDetails类中使用@GenericGenerator和@CollectionId注释来创建主键“ADDRESS\u ID”,不如在ADDRESS类中声明
本文向大家介绍在vue中添加Echarts图表的基本使用教程,包括了在vue中添加Echarts图表的基本使用教程的使用技巧和注意事项,需要的朋友参考一下 前言 我们在项目中经常需要使用一些折线图、柱状图、饼状图等等,之前使用过heightCharts,后来觉得这货不开源,只是做展示的话又点浪费时间,于是看了下eCharts,于是在vue-cli搭建的项目中添加了eCharts,下面是具体步骤和自
问题内容: 按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 假设我是Hibernate的新手,有什么方法可以使我的技能达到最新水平?有没有好的教程? 问题答案: Hibernate.org指出要从以下内容开始: Hibe