如何在DB中映射JPA或Table结构中的实体

时间:2016-12-22 08:00:34

标签: java sql hibernate jpa

我有一个要求,我们需要在用户界面上显示以下信息:



Declare @St Nvarchar(500),@TTable varchar(30) 

Set @TTable='[0Detail]'

create table #TTempStore (

                    Iden Int,
                    Row_ Int,
                    Accs_iden int,
                    Am_Bed Money,
                    Am_Bes Money,
                    Doc_No Decimal(15,0),
                    Desc_ Nvarchar(500),
                    Checked bit,
                    Error_ int)


 Set @St=N' Select * into #TTempStore from '+@TTable
 EXECUTE @St
 Select * from #TTempStore
 drop table #TTempStore --here you can leave the table if you have more things to do

table {
    font-family: arial, sans-serif;
    border-collapse: collapse;
    width: 100%;
}

td, th {
    border: 1px solid #dddddd;
    text-align: left;
    padding: 8px;
}

tr:nth-child(even) {
    background-color: #dddddd;
}




对于这个要求,我在JPA中编写Java实体。

以下是我的实体:

<!DOCTYPE html>
<html>
<body>

<table>
  <tr>
    <th>User Id</th>
    <th>User Name</th>
    <th>Folder1</th>
    <th>Folder2</th>
    <th>Folder3</th>
  </tr>
  <tr>
    <td>1</td>
    <td>U1</td>
    <td>read</td>
    <td>execute</td>
    <td>write</td>
  </tr>
  <tr>
    <td>2</td>
    <td>U2</td>
    <td>execute</td>
    <td>execute</td>
    <td>write</td>
  </tr>
  <tr>
    <td>3</td>
    <td>U3</td>
    <td>read</td>
    <td>write</td>
    <td>write</td>
  </tr>
  <tr>
    <td>4</td>
    <td>U4</td>
    <td>write</td>
    <td>execute</td>
    <td>write</td>
  </tr>
</table>

</body>
</html>

在此映射中,我无法弄清楚如何使用给定文件夹的权限映射用户。因为文件夹可以具有许多权限,并且可以将权限授予不同的文件夹。这是一个多对多的关系。但对于具有特定文件夹的给定用户,将只有1个权限,因此我对如何为此映射创建实体或准备数据库表以在具有文件夹和放大器的用户之间进行映射感到困惑。权限。

这里的假设是修复了文件夹列表,并且修复了权限列表。

3 个答案:

答案 0 :(得分:1)

一种选择是定义自己的表并强制执行PK或@UniqueConstraint的唯一约束。 如下所示:

    @Table(name = "USER_FOLDER_PERMISSION", uniqueConstraints = { @UniqueConstraint(name = "USER_FOLDER_PERM_UNIQUE", columnNames = { "user_id", "folder_id", "permission_id" }) })
    public class UserFolderPermission{
        //either use composite primary key on the 3 fields or define a surrogate primary key
        @ManyToOne
        @JoinColumn(name="user_id")
        private User user;
        @ManyToOne
        @JoinColumn(name="folder_id")
        private Folder folder;
        @ManyToOne
        @JoinColumn(name="permission_id")
        private Permission permission;

        ..
    }

并且可选地在三个实体的关系的反面定义@OneToMany

答案 1 :(得分:0)

我不确定它是否满足您的需求,但在这里您有一个很多的例子,因为我觉得它更合适:

@Entity
User{
   @Id
   int id
   String name

   @ManyToMany(mappedBy="allUser")
   List<Folder> folders;
}


@Entity
Folder{
   @Id
   int id
   String name
   @ManyToMany(mappedBy="allFolders")
   private List<Permission> permissions;

}

@Entity
Permission{
   @Id
   int id
   String name
   @ManyToMany(mappedBy="permissions")
   List<Folder> allFolders;

   @ManyToMany(mappedBy="folders")
   List<User> allUser;

}

答案 2 :(得分:0)

这太模糊了。您想要按字面意思显示该代码还是希望它由浏览器解释?您是否拥有支持动态信息的数据库,或者您是否真的希望为每个用户请求提供确切的代码?

Isah是对的。您需要一个具有复合唯一约束的表,其中包含用户标识,文件夹标识和权限标识。这就是所谓的“自然身份”。任何记录。另外添加一个“替代”主键是很常见的。用于从引用此新表的表列进行快速参考查找。