java - 在 Hibernate 实体中合并表的字段

标签 java mysql hibernate orm

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

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

这是一个带有 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)

技能模型中将提供评级和描述的 getter 和 setter 。

希望我的解释很清楚,并且感谢对此的任何帮助。

预先感谢您的回答,请询问是否需要更多信息。

最佳答案

您应该在 Skill.hbm.xml 中创建一个连接表来执行此任务。下面我提到了一种解决方案。

Skill.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;
    }

}

Skill.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>

Perform Inserting data to the DB :

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();

关于java - 在 Hibernate 实体中合并表的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33415273/

相关文章:

php - SQL - 选择 unixtimestamp 作为日期

java - Spring + hibernate : read/write different datasource and thousands mysql databases

java - Hibernate Annotations - 哪个更好,字段访问还是属性访问?

Hibernate Interceptor onFlushDirty 多次调用相同的值

java - 字符串分词器 : split string by comma and ignore comma in double quotes

java - JTable 行过滤基于两个不同列的值

php - 如何在php中保存sql查询的值?

php - Magento数据库升级1.4.2到1.9验证

java - 在java服务包装器中的wrapper.conf文件中将运行时参数传递到哪里?

java - 使用 android 软键盘更改键入的字符