【问题标题】:Combine tables' fields in Hibernate entity在 Hibernate 实体中合并表的字段
【发布时间】:2016-01-29 15:45:00
【问题描述】:

我目前正在开发一个系统,用户可以在其中将任意数量的技能添加到他们的个人资料中,并为每个人分配一个等级,以显示他们的能力有多先进。系统还允许他们添加描述。

这些是我的数据库表。技能的名称可以是编程语言或其他相关事物。

这是一个带有 Hibernate 的 Spring MVC 项目。 Skill_user 表中的 ID 是其他两个表的外键。一个用户可以拥有 0-* 个技能,一个技能可以分配给 0-* 个用户。

用户

+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| id         | smallint(6) | NO   | PRI | NULL    | auto_increment |
| email      | varchar(75) | NO   |     | NULL    |                |
| password   | varchar(64) | NO   |     | NULL    |                |
| permission | tinyint(4)  | NO   |     | 1       |                |
| verified   | tinyint(1)  | NO   |     | 0       |                |
| blocked    | tinyint(1)  | NO   |     | 0       |                |
+------------+-------------+------+-----+---------+----------------+

技能

+-----------------+-------------+------+-----+---------+----------------+
| Field           | Type        | Null | Key | Default | Extra          |
+-----------------+-------------+------+-----+---------+----------------+
| id              | smallint(6) | NO   | PRI | NULL    | auto_increment |
| name            | varchar(45) | NO   |     | NULL    |                |
+-----------------+-------------+------+-----+---------+----------------+

技能用户

+------------+--------------+------+-----+---------+-------+
| Field      | Type         | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| user_id    | smallint(6)  | NO   | PRI | NULL    |       |
| skill_id   | smallint(6)  | NO   | PRI | NULL    |       |
| rating     | tinyint(1)   | NO   |     | NULL    |       |
| descripton | varchar(250) | YES  |     | NULL    |       |
+------------+--------------+------+-----+---------+-------+

请注意,skill_user 除了外键之外还有许多字段。

现在,我想要一个 Java 类作为 Hibernate 的模型,但不想为 Skill_user 创建单独的模型。这将允许我管理来自用户类的技能,因为理想情况下我的用户类具有以下方法:

void addSkill(Skill s)
Set<Skill> getSkills()
void setSkills(Set<Skill> s)

评分和描述的获取器和设置器将在技能模型中提供。

希望我的解释很清楚,对此的任何帮助表示赞赏。

提前感谢您的回答,如果需要更多信息,请务必询问。

【问题讨论】:

    标签: java mysql hibernate orm


    【解决方案1】:

    您应该在 Skill.hbm.xml 中创建一个 join table 来执行此任务。下面我已经提到了解决方案的方法。

    技能.java

    public class Skill  implements java.io.Serializable {
      private Integer id;
        private String name;
        //defining a set of users
        private Set<User> users = new HashSet<>();
    
        public Set<User> getUsers() {
            return users;
        }
    
        public void setUsers(Set<User> users) {
            this.users = users;
        }
    
        public Skill() {
        }
    
        public Skill(String name) {
            this.name = name;
        }
    
        public Integer getId() {
            return this.id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return this.name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
    }
    

    技能.hbm.xml

    <hibernate-mapping>
        <class name="your_package_name.Skill" table="skill" catalog="skillDB" optimistic-lock="version">
            <id name="id" type="java.lang.Integer">
                <column name="id" />
                <generator class="identity" />
            </id>
            <property name="name" type="string">
                <column name="name" length="45" not-null="true" />
            </property>
            <!--join table will automatically created by this...-->
            <set name="users" table="skill_user" cascade="save-update">
                <key column="skill_id"/>
                <many-to-many class="your_package_name.User" column="user_id"/>
            </set>
        </class>
    </hibernate-mapping>
    

    执行向数据库插入数据:

    Session s = util.HibernateUtil.getSessionFactory().openSession();
            s.beginTransaction();
            User u = new User("johndoe@gmail.com","123456",true,true,true);
            s.save(u);
            Skill skill = new Skill("Programmer");
            skill.getUsers().add(u);
            s.save(skill);
            s.getTransaction().commit();
    

    【讨论】:

    • 感谢您的回复,但我正在尝试使用最少量的 XML 来解决这个问题。有没有办法通过(最好)纯Java来完成?再次感谢您的宝贵时间!
    猜你喜欢
    • 2021-10-15
    • 2012-02-29
    • 2019-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    相关资源
    最近更新 更多