Java 在hibernate中保存值类型集合

Java 在hibernate中保存值类型集合,java,hibernate,collections,Java,Hibernate,Collections,如何在hibernate中使用字符串列表的注释-List保存值类型集合,例如: @Entity public class Student { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private int id; private Set<History> history; } 有人能举一些hibernate注释的例子吗?对于

如何在hibernate中使用字符串
列表的注释-
List
保存值类型集合,例如:

@Entity
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id; 
      private Set<History> history;
}

有人能举一些hibernate注释的例子吗?

对于具有集合值类型的实体,我们需要创建一个单独的表来保存此集合,因为该实体的单行将具有此集合的多个值。在集合值属性上使用@ElementCollection和@CollectionTable注释

@ElementCollection
@CollectionTable(name = "STUDENT_HISTORY", joinColumns = {@JoinColumn(name = STUDENT_ID) }) 
@Column(name="HISTORY") 
private Set<History> history;
HibernateUtil.java

package domain.app.data;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CollectionTable;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;

@Entity
public class Student {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id; 

    @ElementCollection
    @CollectionTable(name="STUDENT_HISTORY", joinColumns={@JoinColumn(name="STUDENT_ID", referencedColumnName="ID")})
    @Column(name="HISTORY")
    private Set<History> history = new HashSet<>();

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Set<History> getHistory() {
        return history;
    }

    public void setHistory(Set<History> history) {
        this.history = history;
    }

    @Override
    public String toString() {
        return "Student [id=" + id + ", history=" + history + "]";
    }
}
package domain.app.data;

import javax.persistence.Column;
import javax.persistence.Embeddable;

@Embeddable
public class History {
    @Column(name="HISTORY")
    private String someAttribute;

    public String getSomeAttribute() {
        return someAttribute;
    }

    public void setSomeAttribute(String someAttribute) {
        this.someAttribute = someAttribute;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((someAttribute == null) ? 0 : someAttribute.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        History other = (History) obj;
        if (someAttribute == null) {
            if (other.someAttribute != null)
                return false;
        } else if (!someAttribute.equals(other.someAttribute))
            return false;
        return true;
    }

}
package domain.app.data.util;

import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;

import domain.app.data.Student;

public class HibernateUtil {

    private static final SessionFactory sessionFactory = buildSessionFactory();

    private static SessionFactory buildSessionFactory() {
        StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().build();
        Configuration configuration = new Configuration();
        configuration.addAnnotatedClass(Student.class);
        return configuration.buildSessionFactory(serviceRegistry);
    }

    public static SessionFactory getSession() {
        return sessionFactory;
    }

}
package domain.app;

import org.hibernate.Session;

import domain.app.data.History;
import domain.app.data.Student;
import domain.app.data.util.HibernateUtil;

public class Application {

    public static void main(String[] args) {
        Session session = HibernateUtil.getSession().openSession();
        session.getTransaction().begin();

        Student student = new Student();
        History history1 = new History();
        history1.setSomeAttribute("Volunteer since 2016");

        History history2 = new History();
        history2.setSomeAttribute("Football team member");

        student.getHistory().add(history1);
        student.getHistory().add(history2);

        session.save(student);
        session.getTransaction().commit();
        session.close();

    }

}
Application.java

package domain.app.data;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CollectionTable;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;

@Entity
public class Student {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id; 

    @ElementCollection
    @CollectionTable(name="STUDENT_HISTORY", joinColumns={@JoinColumn(name="STUDENT_ID", referencedColumnName="ID")})
    @Column(name="HISTORY")
    private Set<History> history = new HashSet<>();

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Set<History> getHistory() {
        return history;
    }

    public void setHistory(Set<History> history) {
        this.history = history;
    }

    @Override
    public String toString() {
        return "Student [id=" + id + ", history=" + history + "]";
    }
}
package domain.app.data;

import javax.persistence.Column;
import javax.persistence.Embeddable;

@Embeddable
public class History {
    @Column(name="HISTORY")
    private String someAttribute;

    public String getSomeAttribute() {
        return someAttribute;
    }

    public void setSomeAttribute(String someAttribute) {
        this.someAttribute = someAttribute;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((someAttribute == null) ? 0 : someAttribute.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        History other = (History) obj;
        if (someAttribute == null) {
            if (other.someAttribute != null)
                return false;
        } else if (!someAttribute.equals(other.someAttribute))
            return false;
        return true;
    }

}
package domain.app.data.util;

import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;

import domain.app.data.Student;

public class HibernateUtil {

    private static final SessionFactory sessionFactory = buildSessionFactory();

    private static SessionFactory buildSessionFactory() {
        StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().build();
        Configuration configuration = new Configuration();
        configuration.addAnnotatedClass(Student.class);
        return configuration.buildSessionFactory(serviceRegistry);
    }

    public static SessionFactory getSession() {
        return sessionFactory;
    }

}
package domain.app;

import org.hibernate.Session;

import domain.app.data.History;
import domain.app.data.Student;
import domain.app.data.util.HibernateUtil;

public class Application {

    public static void main(String[] args) {
        Session session = HibernateUtil.getSession().openSession();
        session.getTransaction().begin();

        Student student = new Student();
        History history1 = new History();
        history1.setSomeAttribute("Volunteer since 2016");

        History history2 = new History();
        history2.setSomeAttribute("Football team member");

        student.getHistory().add(history1);
        student.getHistory().add(history2);

        session.save(student);
        session.getTransaction().commit();
        session.close();

    }

}
hibernate.properties

hibernate.connection.username=admin
hibernate.connection.password=password
hibernate.connection.url=jdbc:h2:~/h2db/test
hibernate.connection.driver_class=org.h2.Driver
hibernate.dialect=org.hibernate.dialect.H2Dialect
hibernate.show_sql=true
hibernate.hbm2ddl.auto=create
logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<configuration debug="false" scan="true" scanPeriod="30 minutes">
    <appender name="Console-Appender" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%gray(%d{yyyy-MM-dd HH:mm:ss.SSS}) %highlight(%5p) %gray(---) %magenta([%15.15t]) %cyan(%-40.40c{1}) %black(:) %m%n%xEx</pattern>
        </encoder>
    </appender>
    <root level="trace">
        <appender-ref ref="Console-Appender" />
    </root>
</configuration>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>stackoverflow</groupId>
    <artifactId>SO-41248001</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.2.5.Final</version>
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.192</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.21</version>
        </dependency>

        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.1.7</version>
        </dependency>

    </dependencies>

</project>

结果为DB:


对于具有集合值类型的实体,我们需要创建一个单独的表来保存此集合,因为该实体的单行将具有此集合的多个值。在集合值属性上使用@ElementCollection和@CollectionTable注释

@ElementCollection
@CollectionTable(name = "STUDENT_HISTORY", joinColumns = {@JoinColumn(name = STUDENT_ID) }) 
@Column(name="HISTORY") 
private Set<History> history;
HibernateUtil.java

package domain.app.data;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CollectionTable;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;

@Entity
public class Student {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id; 

    @ElementCollection
    @CollectionTable(name="STUDENT_HISTORY", joinColumns={@JoinColumn(name="STUDENT_ID", referencedColumnName="ID")})
    @Column(name="HISTORY")
    private Set<History> history = new HashSet<>();

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Set<History> getHistory() {
        return history;
    }

    public void setHistory(Set<History> history) {
        this.history = history;
    }

    @Override
    public String toString() {
        return "Student [id=" + id + ", history=" + history + "]";
    }
}
package domain.app.data;

import javax.persistence.Column;
import javax.persistence.Embeddable;

@Embeddable
public class History {
    @Column(name="HISTORY")
    private String someAttribute;

    public String getSomeAttribute() {
        return someAttribute;
    }

    public void setSomeAttribute(String someAttribute) {
        this.someAttribute = someAttribute;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((someAttribute == null) ? 0 : someAttribute.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        History other = (History) obj;
        if (someAttribute == null) {
            if (other.someAttribute != null)
                return false;
        } else if (!someAttribute.equals(other.someAttribute))
            return false;
        return true;
    }

}
package domain.app.data.util;

import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;

import domain.app.data.Student;

public class HibernateUtil {

    private static final SessionFactory sessionFactory = buildSessionFactory();

    private static SessionFactory buildSessionFactory() {
        StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().build();
        Configuration configuration = new Configuration();
        configuration.addAnnotatedClass(Student.class);
        return configuration.buildSessionFactory(serviceRegistry);
    }

    public static SessionFactory getSession() {
        return sessionFactory;
    }

}
package domain.app;

import org.hibernate.Session;

import domain.app.data.History;
import domain.app.data.Student;
import domain.app.data.util.HibernateUtil;

public class Application {

    public static void main(String[] args) {
        Session session = HibernateUtil.getSession().openSession();
        session.getTransaction().begin();

        Student student = new Student();
        History history1 = new History();
        history1.setSomeAttribute("Volunteer since 2016");

        History history2 = new History();
        history2.setSomeAttribute("Football team member");

        student.getHistory().add(history1);
        student.getHistory().add(history2);

        session.save(student);
        session.getTransaction().commit();
        session.close();

    }

}
Application.java

package domain.app.data;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CollectionTable;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;

@Entity
public class Student {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id; 

    @ElementCollection
    @CollectionTable(name="STUDENT_HISTORY", joinColumns={@JoinColumn(name="STUDENT_ID", referencedColumnName="ID")})
    @Column(name="HISTORY")
    private Set<History> history = new HashSet<>();

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Set<History> getHistory() {
        return history;
    }

    public void setHistory(Set<History> history) {
        this.history = history;
    }

    @Override
    public String toString() {
        return "Student [id=" + id + ", history=" + history + "]";
    }
}
package domain.app.data;

import javax.persistence.Column;
import javax.persistence.Embeddable;

@Embeddable
public class History {
    @Column(name="HISTORY")
    private String someAttribute;

    public String getSomeAttribute() {
        return someAttribute;
    }

    public void setSomeAttribute(String someAttribute) {
        this.someAttribute = someAttribute;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((someAttribute == null) ? 0 : someAttribute.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        History other = (History) obj;
        if (someAttribute == null) {
            if (other.someAttribute != null)
                return false;
        } else if (!someAttribute.equals(other.someAttribute))
            return false;
        return true;
    }

}
package domain.app.data.util;

import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;

import domain.app.data.Student;

public class HibernateUtil {

    private static final SessionFactory sessionFactory = buildSessionFactory();

    private static SessionFactory buildSessionFactory() {
        StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().build();
        Configuration configuration = new Configuration();
        configuration.addAnnotatedClass(Student.class);
        return configuration.buildSessionFactory(serviceRegistry);
    }

    public static SessionFactory getSession() {
        return sessionFactory;
    }

}
package domain.app;

import org.hibernate.Session;

import domain.app.data.History;
import domain.app.data.Student;
import domain.app.data.util.HibernateUtil;

public class Application {

    public static void main(String[] args) {
        Session session = HibernateUtil.getSession().openSession();
        session.getTransaction().begin();

        Student student = new Student();
        History history1 = new History();
        history1.setSomeAttribute("Volunteer since 2016");

        History history2 = new History();
        history2.setSomeAttribute("Football team member");

        student.getHistory().add(history1);
        student.getHistory().add(history2);

        session.save(student);
        session.getTransaction().commit();
        session.close();

    }

}
hibernate.properties

hibernate.connection.username=admin
hibernate.connection.password=password
hibernate.connection.url=jdbc:h2:~/h2db/test
hibernate.connection.driver_class=org.h2.Driver
hibernate.dialect=org.hibernate.dialect.H2Dialect
hibernate.show_sql=true
hibernate.hbm2ddl.auto=create
logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<configuration debug="false" scan="true" scanPeriod="30 minutes">
    <appender name="Console-Appender" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%gray(%d{yyyy-MM-dd HH:mm:ss.SSS}) %highlight(%5p) %gray(---) %magenta([%15.15t]) %cyan(%-40.40c{1}) %black(:) %m%n%xEx</pattern>
        </encoder>
    </appender>
    <root level="trace">
        <appender-ref ref="Console-Appender" />
    </root>
</configuration>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>stackoverflow</groupId>
    <artifactId>SO-41248001</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.2.5.Final</version>
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.192</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.21</version>
        </dependency>

        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.1.7</version>
        </dependency>

    </dependencies>

</project>

结果为DB:


试试这个,它应该会起作用

@Entity
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id; 

    @ElementCollection
    private Collection Set<History> history;
}


@Embeddable
public class History {
private String someAttribute;

......

}
@实体
公立班学生{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“id”)
私有int-id;
@元素集合
私人收藏集历史;
}
@可嵌入
公共课历史{
私有字符串属性;
......
}

试试这个,应该可以

@Entity
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id; 

    @ElementCollection
    private Collection Set<History> history;
}


@Embeddable
public class History {
private String someAttribute;

......

}
@实体
公立班学生{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“id”)
私有int-id;
@元素集合
私人收藏集历史;
}
@可嵌入
公共课历史{
私有字符串属性;
......
}

如何持久化
历史
对象?它是带有外键的单独表还是类型为
Array
的列?@bsiamionau历史记录与一个实例变量名或字符串的ArrayList无关,两者都有问题。我不知道如何保存值类型,据我所知,值类型集合没有主键,它是组合。您将如何持久化
历史
对象?它是带有外键的单独表还是类型为
Array
的列?@bsiamionau历史记录与一个实例变量名或字符串的ArrayList无关,两者都有问题。我不知道如何保存值类型,据我所知,值类型集合没有主键,它是合成的。我不太了解您的示例。请您编写完整的示例,并提供详细信息。谢谢@vijayanandI理解,但您的回答很简短。谢谢。我添加了一个工作示例代码,以防您需要示例查看。我昨天在手机上发布了原始答案,但无法访问可以查看示例的计算机。我不太了解你的示例。请你写完整的示例并详细说明。谢谢@vijayanandI理解,但你的答案很短。谢谢。我添加了一个工作示例代码,以防你需要示例查看。我昨天在手机上贴出了原始答案,但我无法访问电脑查看示例。