相关疑难解决方法(0)

一对多,多对一和多对多的区别?

好的,这可能是一个微不足道的问题,但我无法想象和理解差异以及何时使用每个差异.关于单向和双向映射等概念如何影响一对多/多对多关系,我也有点不清楚.我现在正在使用Hibernate,所以任何与ORM相关的解释都会有所帮助.

举个例子,假设我有以下设置:

public class Person{
    private Long personId;
    private Set<Skill> skills;
    //Getters and setters
}

public class Skill{
    private Long skillId;
    private String skillName;
    //Getters and setters
}
Run Code Online (Sandbox Code Playgroud)

那么在这种情况下我会有什么样的映射?这个具体示例的答案肯定是值得赞赏的,但我也非常希望概述何时使用一对多和多对多以及何时使用连接表与连接列以及单向与双向.

orm many-to-many hibernate one-to-many

129
推荐指数
6
解决办法
9万
查看次数

有没有办法使用ON DUPLICATE KEY更新我要插入的所有内容?

我知道ON DUPLICATE KEY UPDATE如果已经存在该密钥的记录,您可以使用更新某个值,

我可以做这个:

INSERT INTO `tableName` (`a`,`b`,`c`) VALUES (1, 2, 3)
ON DUPLICATE KEY UPDATE `a`=1, `b`=2, `c`=3
Run Code Online (Sandbox Code Playgroud)

但是,如何在不必写出两次列和值的情况下执行此操作?

mysql insert on-duplicate-key

68
推荐指数
4
解决办法
5万
查看次数

MySQL:多个字段的唯一约束

我有两个表 - >变量(id,name)和Variable_Entries(id,var_id,value).

我希望每个变量都有一组唯一的条目.如果我使值条目唯一,那么另一个变量将不能具有相同的值,这是不正确的.

有没有办法让值列对于相同的var_id是唯一的?

mysql sql unique

10
推荐指数
2
解决办法
1万
查看次数

避免在mySQL中插入重复的行

我有一个带有auto_incid(主键)的表.我试图避免插入重复的行.

重复行的示例:

id  | field a | field b | field c |
1       4          6         7
2       4          6         7
Run Code Online (Sandbox Code Playgroud)

key(id)不重复,因为它是由MySQL自动生成的,但所有其他字段都是相同的.

mysql database

7
推荐指数
2
解决办法
2万
查看次数

如何使元组在SQL表中是唯一的?

我的问题很简单,但我不能说出来.我有一个用户表,每个用户都有id.

我想制作友谊表,但我不希望能够有重复的记录.意思不是这个:

id_user1 | id_user2
---------|----------
   2     |    3
   3     |    2
Run Code Online (Sandbox Code Playgroud)

我清楚了吗?

目前我为我的表创建了这个:

CREATE TABLE User(
    id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    surname VARCHAR(100) NOT NULL,
    PRIMARY KEY (id)
);

CREATE TABLE Friends(
    id_user1 INT NOT NULL,
    id_user2 INT NOT NULL,
    PRIMARY KEY(id_user1, id_user2),
    FOREIGN KEY (id_user1) REFERENCES User(id),
    FOREIGN KEY (id_user2) REFERENCES User(id),
);
Run Code Online (Sandbox Code Playgroud)

[编辑1:]也许最佳做法是两次保存每条记录?双向?

mysql sql constraints

7
推荐指数
1
解决办法
1622
查看次数

如何为组合字段的唯一性建模此复杂验证

A link有两个components:componenta_idcomponentb_id.为此,Link我在模型文件中有:

belongs_to :componenta, class_name: "Component"
belongs_to :componentb, class_name: "Component"

validates :componenta_id, presence: true
validates :componentb_id, presence: true
validates :componenta_id, uniqueness: { scope: :componentb_id }
validates :componentb_id, uniqueness: { scope: :componenta_id }
Run Code Online (Sandbox Code Playgroud)

并在迁移文件中:

create_table :links do |t|
  t.integer  :componenta_id, null: false 
  t.integer  :componentb_id, null: false
  ...
end
add_index :links, :componenta_id
add_index :links, :componentb_id
add_index :links, [:componenta_id, :componentb_id], unique: true
Run Code Online (Sandbox Code Playgroud)

问题:这一切都有效.现在,无论他们的顺序如何,我都想要它们的组合componantacomponentb独特性.因此无论哪个组件是哪个组件(componenta哪个是componentb相同的链接;两个相同组件之间的链接).因此,不应允许下面的两个记录,因为它们代表相同的链接,因此不是唯一的:

  • componenta_id = …

ruby migration validation model ruby-on-rails

6
推荐指数
1
解决办法
196
查看次数

并发请求事务以防止不必要的持久化

我试图弄清楚如何解决最初看起来“简单”的问题。

UserAccounts认为可以有很多Purcahse秒,但商业逻辑使然只能有一个PurchasePurchaseState.IDLE状态(在实体领域)。Apurchase在第一次创建时是空闲的。

我有一个存储库,其中包含一种方法来确定用户是否购买了已存在给定状态的产品:

boolean existsByPurchaseStateInAndUserAccount_Id(List<PurchaseState> purchaseState, long userAccountId);
Run Code Online (Sandbox Code Playgroud)

我注意到一些测试并认为当两个请求非常接近/同时传递时(即并发问题和/或竞争条件),我可以创建多个购买。

这导致用户帐户有两次购买,并且都具有 IDLE 状态。

我绘制了一个快速图表来显示我认为正在发生的事情: TX

现在,有没有办法使用 @Transactional 来导致第二个持久性/事务回滚?我不确定简单地包装服务方法@Transcational(isolation=REPEATED_READ) 是否会缓解这个问题?即有没有办法 SQL 将处理这个事务?

我只能猜测这实际上并没有帮助,因为 SQL 事务没有跟踪existsBy,因此不会回滚?

countBy如果存在 >1 个符合条件的实体,是否是在方法结束时运行第二个查询以回滚事务的唯一真正解决方案?我仍然不觉得这是“完美的”并完全解决了竞争条件/TX 问题......

TX2

因此,该服务将看到有 2 个实体在两个事务中提交(尚未提交),但对于 T2,该服务可以抛出 RuntimeException 以触发回滚?

抱歉,我一直在阅读有关事务隔离的内容,但它似乎只适用于说我是否正在检查实体的字段值/列,而不是使用基于“count(*)”查询返回的逻辑。 ..

谢谢你的任何启示。

java mysql spring transactions spring-boot

6
推荐指数
1
解决办法
124
查看次数

@Stateless webservice with JPA + JTA:如何提交托管实体的更改?

我将以下简单的webservice声明为@StatelessEJB,在GlassFish 3.1.2.2上使用EclipseLink 2.4.1运行,使用JTA DataSource连接到MySQL数据库:

@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response update(TimeRow e) throws Exception {
    if ((e.getKey() == null) || !e.getKey().keyValid()) {
        return Response.status(400).build();
    }

    TimeRow existing = em.find(TimeRow.class, e.getKey());
    if (existing == null) {
        em.persist(e);
    } else {
        existing.setValues(e.getValues());
        em.flush();
    }
    return Response.status(204).build();
}
Run Code Online (Sandbox Code Playgroud)

实体类TimeRow:

@Entity
@NamedQueries({
    @NamedQuery(name="TimeRow.findAllByUser",
         query="SELECT t FROM TimeRow t WHERE t.table.userId = :uid")
})
public class TimeRow implements Serializable {

    @EmbeddedId
    private TimeRowPK key;

    @MapsId("userId")
    @JoinColumn(name = "USERID", referencedColumnName = "userId")
    @ManyToOne …
Run Code Online (Sandbox Code Playgroud)

java ejb jpa jta jax-rs

5
推荐指数
1
解决办法
1132
查看次数

在MySQL表中设置唯一的列对

我正在使用php-MySQL在后端进行项目.它有各种文章可供浏览,分类为各种类别用户登录系统.
我最近添加了一个监视列表功能,使用户可以将文章添加到他们的监视列表/仪表板中.
我有以下表格.

文章
article-id(int)主要 - 唯一
cat(varchar)
名称(varchar)
subCat(varchar)
description(varchar)
添加日期

用户
用户名(varchar)主要唯一
lname
fname
加入日期

.监视列表
article-id(int)
username(varchar)
date_watch

我们可以看到没有用于监视列表表的唯一键
我想要(username + article-id)一个唯一的对因为每个用户名都存在多于1个文章ID而且反之亦然
我只想插入删除行和它并不需要更新他们
如何防止重复条目?
到现在为止我一直用php检查行数

"SELECT * FROM watchlist WHERE article-id={$id} AND username={$user}"
Run Code Online (Sandbox Code Playgroud)

而如果

mysql_num_rows() >1(not allowed to insert) 
Run Code Online (Sandbox Code Playgroud)

这工作正常,但如果错误地执行INSERT命令将是一个重复的条目
如何防止它?
我正在使用phpmyadmin

php mysql

3
推荐指数
1
解决办法
3301
查看次数

如何使mysql中的一对列唯一

+----+---------------+-------+---------------+
| id |     name      | phone |    ip_addr    |
+----+---------------+-------+---------------+
|  1 | customname001 |  1234 | 192.168.100.1 |
|  2 | customname002 |  2156 | 192.168.100.2 |
|  3 | customname003 |  9685 | 192.168.100.3 |
|  4 | customname004 |  1546 | 192.168.100.1 |
|  5 | customname005 |  1234 | 192.168.100.1 |
+----+---------------+-------+---------------+
Run Code Online (Sandbox Code Playgroud)

在我的 codeigniter 项目中,我试图构建一个模型,它将帮助我将新行插入到与上面类似的表中。我在这里要应用的条件是检查姓名、电话和 ip_addr 的组合是否唯一。

我知道对于单个列,如果我们将值设置为唯一,那么这些值就不能重复,但我的示例是不同的情况,我希望所有列(除了 id 之外)的组合是唯一的。

任何人都可以帮助我构建模型,该模型将帮助我添加新的姓名、电话和 ip_addr 对,并检查该对是否已存在并相应地给出反馈。

php mysql codeigniter

3
推荐指数
1
解决办法
1442
查看次数